package main

import (
	"fmt"
)

func main() {

	/*
		Go 语言切片是对数组的抽象。
		Go 数组的长度不可改变，在特定场景中这样的集合就不太适用，
		Go中提供了一种灵活，功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的，可以追加元素，在追加时可能使切片的容量增大
	*/

	s := []int{1, 2, 3}
	//将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片（前闭后开
	s = s[1:2]
	fmt.Println(s)

	s1 := []float32{1.1, 2.2, 3.3, 4.4}
	s1 = s1[2:]
	fmt.Println(s1)

	//slice没有自己的任何数据,.它只是底层数组的一个表示。对slice所做的任何修改都将反映在底层数组中。
	darr := [...]int{57, 89, 90, 82, 100, 78}
	dslice := darr[2:5]
	fmt.Println("array before", darr)

	for i := range dslice {
		dslice[i]++
	}

	fmt.Println("array after", darr)

	//当多个片共享相同的底层数组时，每个元素所做的更改将在数组中反映出来。
	numa := [3]int{78, 79, 80}
	nums1 := numa[:]
	nums2 := numa[:]

	fmt.Println("numa=", numa)
	nums1[0] = 100
	fmt.Println("numa=", numa)
	nums2[1] = 101
	fmt.Println("numa=", numa)

	ints := make([]int, 3, 5)

	fmt.Println("ints len=", len(ints))
	fmt.Println("ints cap=", cap(ints))

	var numbers []int
	printSlice(numbers)

	if numbers == nil {
		fmt.Println("numbers is null")
	}

	numbers = []int{1, 2, 3, 4, 5, 6}
	printSlice(numbers)

	numbers = append(numbers, 0)
	printSlice(numbers)

	numbers = append(numbers, 2, 3, 4)
	printSlice(numbers)

	/* 创建切片 numbers1 是之前切片的两倍容量*/
	numbers1 := make([]int, len(numbers), cap(numbers)*2)
	printSlice(numbers1)
	copy(numbers1, numbers)
	printSlice(numbers1)
}

func printSlice(x []int) {
	fmt.Printf("len=%d, cap=%d, slice=%v \n", len(x), cap(x), x)
}
